

const SDKAppID = 1600036635;
const secretKey = '12ac76a40d7c09537f31a49dfe8fd2ba54515a278c8ef85c4304b25a4fddf58f';
const EXPIRETIME = 604800; // 7天

class CloudChat {
    constructor() {
        const options = {
            SDKAppID: SDKAppID
        };
        
        // 连接
        this.init(options);

        // 绑定事件处理函数  
        this.bindEvents();
    }

    // 绑定WebSocket事件  
    bindEvents() {
        if (this.chat) {
            // 监听im连接打开事件
            this.chat.on(TencentCloudChat.EVENT.SDK_READY, this.onSdkReady.bind(this));

            // 监听WebSocket关闭 
            this.chat.on(TencentCloudChat.EVENT.SDK_NOT_READY, this.onSdkNotReady.bind(this));

            // 监听收到推送的单聊、群聊、群提示、群系统通知的新消息
            this.chat.on(TencentCloudChat.EVENT.MESSAGE_RECEIVED, this.onMessageReceived.bind(this));

            // 监听群组计数器更改
            this.chat.on(TencentCloudChat.EVENT.GROUP_COUNTER_UPDATED, this.onGroupCounterUpdated.bind(this));
            
            // 监听群组事件
            this.chat.on(TencentCloudChat.EVENT.GROUP_LIST_UPDATED, this.onGroupListUpdated.bind(this));

            // 监听网络状态发生改变
            this.chat.on(TencentCloudChat.EVENT.NET_STATE_CHANGE, this.onNetStateChange.bind(this));
        }

    }

    // 连接im服务
    init(options) {
        // 清除之前的连接（如果有的话）  
        this.disconnect();
        this.chat = TencentCloudChat.create(options);

        //设置日志级别
        this.chat.setLogLevel(0);

        // 注册腾讯云即时通信 IM 上传插件
        // this.chat.registerPlugin({'tim-upload-plugin': TIMUploadPlugin});


        // 注册腾讯云即时通信 IM 本地审核插件
        // this.chat.registerPlugin({'tim-profanity-filter-plugin': TIMProfanityFilterPlugin});
        
        // 登录
        this.login('administrator');
    }
    
    // 登录
    login(userId) {
        if (this.chat) {
            const options = {
                userID: userId,
                userSig: this.genTestUserSig(userId)
            };
            this.chat.login(options).then((imResponse) => {
                console.log('im登录成功！', imResponse);
                this.joinGroup('@TGS#a36EQWIO5');
            }).catch((err) => {
                console.error('im登录失败！', err);
            });
        } else {
            console.error('im未初始化！不能登录！');
        }
    }

    // 签名
    genTestUserSig(userID) {
        const generator = new LibGenerateTestUserSig(SDKAppID, secretKey, EXPIRETIME);
        return generator.genTestUserSig(userID);
    }

    // 登出
    logout() {
        if (this.chat) {
            this.chat.logout().then((imResponse) => {
                console.log('im登出成功！', imResponse);
            }).catch((err) => {
                console.error('im登出失败！', err);
            });
        }
    }

    // 关闭连接  
    disconnect() {
        if (this.chat) {
            // 销毁 SDK 实例。SDK 会先 logout，然后断开 WebSocket 长连接，并释放资源。
            this.chat.destroy();
            console.log('im连接已关闭');
        }
    }

    // im连接打开时的回调函数  
    onSdkReady(event) {
        console.log('im连接已打开！', event);
        // 消息类型：
        // C2C[私聊]TencentCloudChat.TYPES.CONV_C2C；
        // GROUP[群聊]TencentCloudChat.TYPES.CONV_GROUP
        // this.send('Hello world!', 'GROUP', 'group1');
        // this.createGroup(); //创建直播群
    }
    
    //创建直播群
    createGroup() {
        if (this.chat) {
            const options = {
                name: 'uni-im-test',
                type: TencentCloudChat.TYPES.GRP_AVCHATROOM,
                joinOption: TencentCloudChat.TYPES.JOIN_OPTIONS_FREE_ACCESS
            }
            this.chat.createGroup(options).then((imResponse) => {
                console.log('创建群组成功', imResponse.data.group);
                this.groupId = imResponse.data.group;
                this.joinGroup(this.groupId, '欢迎大家加入');
            })
        }
    }

    //加入直播群
    joinGroup(groupId) {
        if (this.chat) {
            const options = {
                groupID: groupId,
                type: TencentCloudChat.TYPES.GRP_AVCHATROOM
            }
            this.chat.joinGroup(options).then((imResponse) => {
                switch (imResponse.data.status) {
                    case TencentCloudChat.TYPES.JOIN_STATUS_WAIT_APPROVAL:
                        console.log('等待管理员同意');
                        break;
                    case TencentCloudChat.TYPES.JOIN_STATUS_SUCCESS:
                        console.log('加群成功', imResponse.data.group); // 加入的群组资料
                        break;
                    case TencentCloudChat.TYPES.JOIN_STATUS_ALREADY_IN_GROUP:
                        console.log('已经在群中');
                        break;
                    default:
                        console.log('加群其他未知');
                        break;
                }
            }).catch((imError) => {
                console.warn('加群 error:', imError); // 申请加群失败的相关信息
            });
        } else {
            console.error('im未连接，无法加入直播群！');
        }
    }

    //退出群组
    quitGroup(groupId) {
        if (this.chat) {
            this.chat.quitGroup(groupId).then((imResponse) => {
                // imResponse.data.groupID  退出成功的群 ID
                console.log('退出群组成功');
            }).catch((imError) => {
                console.warn('退出群组 error:', imError);
            });
        } else {
            console.error('im未连接，无需退出群组');
        }
    }

    // 发送文本数据  
    sendText(msg, type, id) {
        if (this.chat) {
            const message = this.chat.createTextMessage({
                to: id,
                conversationType: type,
                payload: { text: msg }
            });
            this.chat.sendMessage(message).then((imResponse) => {
                console.log('发送文本消息成功', message);
            }).catch((imError) => {
                console.warn('发送文本消息 error:', imError);
            });
        } else {
            console.error('im连接未建立，无法发送文本消息');
        }
    }

    // 发送表情数据 
    sendFace(index, data, type, id) {
        if (this.chat) {
            const message = this.chat.createTextMessage({
                to: id,
                conversationType: type,
                payload: {
                    text: message,
                    data: data
                }
            });
            this.chat.sendMessage(message).then((imResponse) => {
                console.error('发送表情消息成功', imResponse);
            }).catch((imError) => {
                console.warn('发送表情消息 error:', imError);
            });
        } else {
            console.error('im连接未建立，无法发送表情消息');
        }
    }

    // 收到推送的单聊、群聊、群提示、群系统通知的新消息时的回调函数
    onMessageReceived(event) {
        // event.data - 存储 Message 对象的数组 - [Message]
        const messageList = event.data;
        messageList.forEach((message) => {
            if (message.type === TencentCloudChat.TYPES.MSG_TEXT) {
                // 文本消息
                console.log('[收]文本', message);
            } else if (message.type === TencentCloudChat.TYPES.MSG_FACE) {
                // 表情消息
                console.log('[收]表情', message);
            } else if (message.type === TencentCloudChat.TYPES.MSG_GRP_TIP) {
                // 群提示消息
                console.log('[收]提示', message);
            } else if (message.type === TencentCloudChat.TYPES.MSG_GRP_SYS_NOTICE) {
                // 群系统通知
                console.log('[收]通知', message);
                const { operationType, userDefinedField } = message.payload;
                // operationType - 操作类型 [255：用户自定义字段]
                // userDefinedField - 用户自定义字段（对应 operationType 为 255）
                // 使用 RestAPI 在群组中发送系统通知时，接入侧可从 userDefinedField 拿到自定义通知的内容。
            }

        });
        // console.log('收到服务器内容：', event.data);
    }

    // im关闭时的回调函数  
    onSdkNotReady(event) {
        console.log('im连接已关闭！', event);
        // 登录 
        this.chat.login({userID: 'your userID', userSig: 'your userSig'});
    }

    // 群组事件回调函数
    onGroupListUpdated(event) {
        console.log('群组列表更新啦', event.data);
    }

    // 网络状态发生改变的回调函数
    onNetStateChange(event) {
        // event.data.state 当前网络状态，枚举值及说明如下：
        // TencentCloudChat.TYPES.NET_STATE_CONNECTED - 已接入网络
        // TencentCloudChat.TYPES.NET_STATE_CONNECTING
        // 连接中。很可能遇到网络抖动，SDK 在重试。接入侧可根据此状态提示“当前网络不稳定”或“连接中”
        // TencentCloudChat.TYPES.NET_STATE_DISCONNECTED
        // 未接入网络。接入侧可根据此状态提示“当前网络不可用”。SDK 仍会继续重试，若用户网络恢复，SDK 会自动同步消息
        console.log('im网络变化啦', event.data.state);
    }

    /**************** 群组计数器 *******************/
    //创建
    setGroupCounters(groupID, keyList) {
        if (this.chat) {
            const options = {
                groupID: groupID,
                keyList: keyList
            };
            this.chat.setGroupCounters(options).then((imResponse) => {
                console.log('创建计数成功', imResponse.data);
                console.log(imResponse.data.counters);
            }).catch((imError) => {
                console.warn('创建计数 error:', imError);
            });

        } else {
            console.error('im未连接，无需创建计数');
        }
    }

    //获取
    getGroupCounters(groupID, keyList=[]) {
        if (this.chat) {
            const options = {
                groupID: groupID,
                keyList: keyList
            };
            this.chat.getGroupCounters(options).then((imResponse) => {
                console.log('获取计数成功', imResponse.data);
                console.log(imResponse.data.counters);
            }).catch((imError) => {
                console.warn('获取计数 error:', imError);
            });
        } else {
            console.error('im未连接，无需获取计数');
        }
    }

    //递增
    increaseGroupCounter(groupID, key, value=1) {
        if (this.chat) {
            const options = {
                groupID: groupID,
                key: key,
                value: value
            };
            this.chat.increaseGroupCounter(options).then((imResponse) => {
                console.log('递增成功', imResponse.data);
                const { groupID, key, value } = imResponse.data;
            }).catch((imError) => {
                console.warn('递增 error:', imError);
            });
        } else {
            console.error('im未连接，无需计数递增');
        }
    }

    //递减
    decreaseGroupCounter(groupID, key, value=1) {
        if (this.chat) {
            const options = {
                groupID: groupID,
                key: key,
                value: value
            };
            this.chat.decreaseGroupCounter(options).then((imResponse) => {
                console.log('递减成功', imResponse.data);
                const { groupID, key, value } = imResponse.data;
            }).catch((imError) => {
                console.warn('递减 error:', imError);
            });
        } else {
            console.error('im未连接，无需计数递减');
        }
    }

    //更改触发回调
    onGroupCounterUpdated(event) {
        const { groupID, key, value } = event.data;
        // groupID - 群组 ID
        // key - 群计数器 key
        // value - 群计数器 key 对应的 value
    }

}

export default CloudChat;